package main

import (
	"database/sql"
	"errors"
	"fmt"
	xerrors "github.com/pkg/errors"
	"log"
)
/**
  dao层应该向上抛出错误，错误需要在service层处理，两种不同的思路
  1、包装后直接向上抛出错误，以获取发生错误的具体位置,daoUser和serviceUser
  2、项目开发时一般定义自己的错误，利于解耦避免一些强依赖问题，例子ErrRecordNotFound、daoUser2和serviceUser2
 */
func daoUser() error {
	return xerrors.Wrap(sql.ErrNoRows, "没有数据")
}

func serviceUser()  {
	err := daoUser()

	if errors.Is(err, sql.ErrNoRows) {
		log.Printf("测试is  %+v", err)
	}
}

var ErrRecordNotFound = errors.New("没有发现数据")

func daoUser2() error {
	var err = sql.ErrNoRows
	return xerrors.Wrapf(ErrRecordNotFound,  fmt.Sprintf("error: %v", err))
}

func serviceUser2()  {
	err := daoUser2()

	if errors.Is(err, ErrRecordNotFound) {
		log.Printf("测试ErrRecordNotFound  %+v", err)
	}
}

func main() {
	log.Printf("-----------------------serviceUser---------------------")
	serviceUser()

	log.Printf("-----------------------serviceUser2---------------------")
	serviceUser2()
}
